#pragma once

#include<iostream>
#include<string>
#include<cstring>
#include<sys/socket.h>

class Util{
public:
    static int ReadLine(int sock, std::string& line) {
        
        //TCP是流式服务，那我们就一个一个字符的读取
        //我们默认这样一个前提
        //\r, \n, \r\n这三种形式都为行分隔符
        //我们要将其转换成统一的格式\n

        char ch = 0;
        while (ch != '\n') {
            ssize_t s = recv(sock, &ch, 1, 0);
            if (s > 0) {
                if (ch == '\r') {
                    //MSG_PEEK表示我们看一下去缓冲区内的字符，并不取走它
                    recv(sock, &ch, 1, MSG_PEEK);
                    //如果是\n我们再取走它，先观察的原因是防止取走其它行的数据
                    if (ch == '\n') {
                        recv(sock, &ch, 1, 0);
                    }
                    else {
                        ch = '\n';
                    }
                }

                //普通字符或\n
                line.push_back(ch);
            }
            else if (s == 0) {
                //对端关闭
                return 0;
            }
            else {
                //读取失败
                return -1;
            }
        }
        return line.size();
    }

    static bool CutString(const std::string& target, std::string& key, std::string& val, const std::string& sep) {

        int pos = target.find(sep);
        if (pos != std::string::npos) {
            key = target.substr(0, pos);
            val = target.substr(pos + sep.size());
            return true;
        }
        return false;
    }
private:
};